﻿using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Xml;
using com.creditos.be.liclBases;
using System.Xml.XPath;

namespace com.creditos.dao.liclCerticom
{
    public class CerticomLocal
    {

        #region Atributos
        private string PsNroDoc = "";
        private string PsApe01 = "";
        private string PsApe02 = "";
        private string PsNombres = "";
        private string sTipoConsulta = "";
        private string usuarioCerticom = "";
        private string sesionCerticom = "";
        private string usuario = "";
        private string pass = "";

        private ParametrosCDR parametros;

        private List<Calificacion> Calificaciones;
        private List<Deudas> Deudas;
        private List<Morosidad> MorosidadList;
        private List<MorosidadSBS> MorosidadesSBS;
        private List<MorosidadActual> MorosidadesActual;
        private List<MorosidadHistorica> MorosidadesHistorica;
        private List<Protesto> Protestos;
        private List<ProtestoAceptante> ProtestosAceptante;
        private List<ProtestoGirador> ProtestosGiradores;
        private List<Adversos> AdversosList;
        private List<Omisos> OmisosList;
        private List<DatGen> DatGenList;
        private List<OtrDir> OtrDirList;
        private List<RepresentantesLegales> RepLegalesList;
        #endregion
        #region Propiedades

        public string NroDoc
        {
            get { return PsNroDoc; }
            set { PsNroDoc = value; }
        }

        public string ApePaterno
        {
            get { return PsApe01; }
            set { PsApe01 = value; }
        }

        public string ApeMaterno
        {
            get { return PsApe02; }
            set { PsApe02 = value; }
        }

        public string Nombres
        {
            get { return PsNombres; }
            set { PsNombres = value; }
        }

        public string TipoConsulta
        {
            get { return sTipoConsulta; }
            set { sTipoConsulta = value; }
        }

        public string UsuarioCerticom
        {
            get { return usuarioCerticom; }
            set { usuarioCerticom = value; }
        }

        public string SesionCerticom
        {
            get { return sesionCerticom; }
            set { sesionCerticom = value; }
        }

        public string Usuario
        {
            set { usuario = value; }
            get { return usuario; }
        }
        public string Pass
        {
            set { pass = value; }
            get { return pass; }
        }

        public ParametrosCDR Parametros
        {
            set { parametros = value; }
            get { return parametros; }
        }



        #endregion
        #region PropiedadesListas

        public List<Calificacion> calificaciones { get { return Calificaciones; } }
        public List<Deudas> deudas { get { return Deudas; } }
        public List<MorosidadSBS> morosidadesSBS { get { return MorosidadesSBS; } }
        public List<MorosidadActual> morosidadesActual { get { return MorosidadesActual; } }
        public List<MorosidadHistorica> morosidadesHistorica { get { return MorosidadesHistorica; } }
        public List<ProtestoAceptante> protestosAceptante { get { return ProtestosAceptante; } }
        public List<ProtestoGirador> protestosGiradores { get { return ProtestosGiradores; } }
        public List<Adversos> adversosList { get { return AdversosList; } }
        public List<Omisos> omisosList { get { return OmisosList; } }
        public List<DatGen> datGenList { get { return DatGenList; } }
        public List<OtrDir> otrDirList { get { return OtrDirList; } }
        public List<RepresentantesLegales> repLegalesList { get { return RepLegalesList; } }
        public List<Morosidad> morosidadList { get { return MorosidadList; } }
        public List<Protesto> protestos { get { return Protestos; } }



        #endregion
        #region Login

        private DLLCerticom oCerticom;
        private string NERROR = "-2146697211";
        private string ERROR = string.Empty;
        public void Login()
        {
            oCerticom = new DLLCerticom();


            XmlDocument xmlDoc = new XmlDocument();
            try
            {
                if (this.usuarioCerticom == string.Empty && this.sesionCerticom == string.Empty)
                {
                    xmlDoc = oCerticom.LoadCerticon(usuario, pass);
                    XmlNodeList Session = xmlDoc.SelectNodes("OUT");
                    foreach (XmlElement nodo in Session)
                    {
                        UsuarioCerticom = (GetValorNodo(nodo, "CO_USUARI"));
                        SesionCerticom = (GetValorNodo(nodo, "ID_SESION"));
                        NERROR = (GetValorNodo(nodo, "NERROR"));
                    }
                    if (!NERROR.Equals("0"))
                    {
                        XmlNodeList SessionError = xmlDoc.SelectNodes("DOCUMENTO");
                        foreach (XmlElement nodo in SessionError)
                        {
                            NERROR = (GetValorNodo(nodo, "NERROR"));
                            ERROR = (GetValorNodo(nodo, "ERROR"));
                        }
                    }
                }
            }
            catch (Exception)
            {
                NERROR = "-1245678";
            }

        }

        #endregion
        #region consulta y explotacion de xml

        private XmlDocument xmlDoc;

        public string XmlSalidaCerticom
        {
            get { return xmlDoc.InnerXml; }
        }
        public string DatosEnvio
        {
            get { return string.Format("{0}{1}{2}{3}{4}{5}", SesionCerticom, PsNroDoc, PsApe01, PsApe02, PsNombres, UsuarioCerticom); }
        }

        public void ConsultaPersona()
        {

            xmlDoc = new XmlDocument();
            if (Convert.ToInt32(SesionCerticom) != 0)
            {
                if (TipoConsulta == "PN")
                {

                    xmlDoc = oCerticom.AproximacionPN(SesionCerticom, PsNroDoc.Trim(), PsApe01.Trim(), PsApe02.Trim(), PsNombres.Trim(), "", UsuarioCerticom);
                }
                else if (TipoConsulta == "PJ")
                {

                    xmlDoc = oCerticom.AproximacionPJ(SesionCerticom, PsNroDoc.Trim(), PsApe01.Trim(), UsuarioCerticom);
                }
            }

        }

        public bool ExtraccionDatos()
        {
            bool ConexionExitosa = true;

            Login();

            if (NERROR.Equals("0"))
            {
                ConsultaPersona();
                LlenarDatos();
            }
            else
            {
                ConexionExitosa = false;
            }
            return ConexionExitosa;
        }

        private void LlenarDatos()
        {
            Calificaciones = new List<Calificacion>();
            Deudas = new List<Deudas>();
            MorosidadesSBS = new List<MorosidadSBS>();
            MorosidadesActual = new List<MorosidadActual>();
            MorosidadesHistorica = new List<MorosidadHistorica>();
            ProtestosAceptante = new List<ProtestoAceptante>();
            ProtestosGiradores = new List<ProtestoGirador>();
            AdversosList = new List<Adversos>();
            OmisosList = new List<Omisos>();
            DatGenList = new List<DatGen>();
            OtrDirList = new List<OtrDir>();
            RepLegalesList = new List<RepresentantesLegales>();
            MorosidadList = new List<Morosidad>();
            Protestos = new List<Protesto>();

            XmlNodeList ListaCal = xmlDoc.SelectNodes("OUT/SBS/CALIFICACION/CAL");
            foreach (XmlElement nodo in ListaCal)
            {
                Calificacion oCalificacion = new Calificacion();

                oCalificacion.FechaReporte = Convert.ToDateTime(GetValorNodo(nodo, "FE_REPORT"));
                oCalificacion.Entidades = Convert.ToInt32(GetValorNodo(nodo, "CA_ENTIDA"));
                oCalificacion.CallDeficiente = GetValorNodo(nodo, "TI_CALDEF") == string.Empty ? new decimal(0) : Convert.ToDecimal(GetValorNodo(nodo, "TI_CALDEF"));
                oCalificacion.CallCPP = GetValorNodo(nodo, "TI_CALCPP") == string.Empty ? new decimal(0) : Convert.ToDecimal(GetValorNodo(nodo, "TI_CALCPP"));
                oCalificacion.CallDudoso = GetValorNodo(nodo, "TI_CALDUD") == string.Empty ? new decimal(0) : Convert.ToDecimal(GetValorNodo(nodo, "TI_CALDUD"));
                oCalificacion.CallPerdida = GetValorNodo(nodo, "TI_CALPER") == string.Empty ? new decimal(0) : Convert.ToDecimal(GetValorNodo(nodo, "TI_CALPER"));
                oCalificacion.CalNormal = GetValorNodo(nodo, "TI_CALNOR") == string.Empty ? new decimal(0) : Convert.ToDecimal(GetValorNodo(nodo, "TI_CALNOR"));

                Calificaciones.Add(oCalificacion);
            }

            XmlNodeList ListaDeudas = xmlDoc.SelectNodes("OUT/SBS/DEUDA/DEU");
            foreach (XmlElement nodo in ListaDeudas)
            {
                Deudas oDeuda = new Deudas();

                _valor = 0;
                _fecha = string.Empty;
                oDeuda.FechaReporte = (GetValorNodo(nodo, "FE_REPORT"));
                oDeuda.CodCuentaSBS = GetValorNodo(nodo, "CO_CUENTA") == string.Empty ? new decimal(0) : (Convert.ToDecimal(GetValorNodo(nodo, "CO_CUENTA")) / 10000);
                oDeuda.TipoMoneda = (GetValorNodo(nodo, "TI_MONEDA"));
                oDeuda.Importe = GetValorNodo(nodo, "IM_CUENTA") == string.Empty ? new decimal(0) : Convert.ToDecimal(GetValorNodo(nodo, "IM_CUENTA"));
                _valor = oDeuda.CodCuentaSBS;
                _fecha = oDeuda.FechaReporte;
                Deudas aux = new Deudas();
                aux = Deudas.Find(encuentraDeuda);
                if (aux != null)
                {
                    Deudas.RemoveAll(encuentraDeuda);

                    if (oDeuda.TipoMoneda.Equals(Moneda.DOLARES))
                    {
                        aux.ImpReportDolares = oDeuda.Importe;
                    }
                    else if (oDeuda.TipoMoneda.Equals(Moneda.SOlES))
                    {
                        aux.ImpReportSoles = oDeuda.Importe;
                    }
                    Deudas.Add(aux);
                }
                else
                {
                    if (oDeuda.TipoMoneda.Equals(Moneda.DOLARES))
                    {
                        oDeuda.ImpReportDolares = oDeuda.Importe;
                    }
                    else if (oDeuda.TipoMoneda.Equals(Moneda.SOlES))
                    {
                        oDeuda.ImpReportSoles = oDeuda.Importe;
                    }
                    Deudas.Add(oDeuda);
                }
            }


            XmlNodeList ListaMorosidad = xmlDoc.SelectNodes("OUT/SBS/MOROSIDAD/MOR");
            foreach (XmlElement nodo in ListaMorosidad)
            {
                MorosidadSBS oMorosidadSBS = new MorosidadSBS();

                oMorosidadSBS.FechaReporte = Convert.ToDateTime(GetValorNodo(nodo, "FE_REPORT"));
                oMorosidadSBS.EntidadReportante = (GetValorNodo(nodo, "NO_ENTIDA"));
                oMorosidadSBS.CodigoCuentaSBS = GetValorNodo(nodo, "CO_CUENTA") == string.Empty ? new decimal(0) : (Convert.ToDecimal(GetValorNodo(nodo, "CO_CUENTA").Substring(0, 10)));
                oMorosidadSBS.DiasMora = GetValorNodo(nodo, "CA_DIAMOR") == string.Empty ? new decimal(0) : Convert.ToDecimal(GetValorNodo(nodo, "CA_DIAMOR"));
                oMorosidadSBS.Importe = GetValorNodo(nodo, "IM_CUENTA") == string.Empty ? new decimal(0) : Convert.ToDecimal(GetValorNodo(nodo, "IM_CUENTA"));
                oMorosidadSBS.TipoMoneda = GetValorNodo(nodo, "TI_MONEDA");

                MorosidadesSBS.Add(oMorosidadSBS);

            }

            /*
             *   Numero de secuencia "nrosecuencia  entre actual e historica "
             */
            decimal nrosecuencia = new decimal(0);
            XmlNodeList ListaMorosidadActual = xmlDoc.SelectNodes("OUT/MOROSIDAD/ACTUAL/MOR");
            foreach (XmlElement nodo in ListaMorosidadActual)
            {
                nrosecuencia = nrosecuencia + 1;

                Morosidad oMorosidadActual = new Morosidad();

                oMorosidadActual.NomDocumento = GetValorNodo(nodo, "NO_DOCUME");
                oMorosidadActual.TipoMora = TIPOMORA.ACTUAL;
                oMorosidadActual.NumeroSecuencia = nrosecuencia;
                oMorosidadActual.CodDocumento = GetValorNodo(nodo, "CO_DOCUME");
                oMorosidadActual.FechaVencimiento = Convert.ToDateTime(GetValorNodo(nodo, "FE_VENCIM"));
                oMorosidadActual.FechaReporte = Convert.ToDateTime(GetValorNodo(nodo, "FE_REPORT"));
                oMorosidadActual.EntidadRepresentante = (GetValorNodo(nodo, "NO_ENTIDA"));
                oMorosidadActual.Importe = GetValorNodo(nodo, "IM_DOCUME") == string.Empty ? new decimal(0) : Convert.ToDecimal(GetValorNodo(nodo, "IM_DOCUME"));
                oMorosidadActual.Observaciones = GetValorNodo(nodo, "NO_OBSERV");
                oMorosidadActual.TipoMoneda = GetValorNodo(nodo, "TI_MONEDA");

                MorosidadList.Add(oMorosidadActual);
            }

            XmlNodeList ListaMorosidadHistorica = xmlDoc.SelectNodes("OUT/MOROSIDAD/HISTORICA/MOR");
            foreach (XmlElement nodo in ListaMorosidadHistorica)
            {
                nrosecuencia = nrosecuencia + 1;

                Morosidad oMorosidadHistorica = new Morosidad();
                oMorosidadHistorica.TipoMora = TIPOMORA.HISTORICA;
                oMorosidadHistorica.NumeroSecuencia = nrosecuencia;
                oMorosidadHistorica.NomDocumento = GetValorNodo(nodo, "NO_DOCUME");
                oMorosidadHistorica.CodDocumento = GetValorNodo(nodo, "CO_DOCUME");
                oMorosidadHistorica.FechaVencimiento = Convert.ToDateTime(GetValorNodo(nodo, "FE_VENCIM"));
                oMorosidadHistorica.FechaReporte = Convert.ToDateTime(GetValorNodo(nodo, "FE_REPORT"));
                oMorosidadHistorica.EntidadRepresentante = (GetValorNodo(nodo, "NO_ENTIDA"));
                oMorosidadHistorica.Importe = GetValorNodo(nodo, "IM_DOCUME") == string.Empty ? new decimal(0) : Convert.ToDecimal(GetValorNodo(nodo, "IM_DOCUME"));
                oMorosidadHistorica.Observaciones = GetValorNodo(nodo, "NO_OBSERV");
                oMorosidadHistorica.TipoMoneda = GetValorNodo(nodo, "TI_MONEDA");

                MorosidadList.Add(oMorosidadHistorica);
            }


            /*
             *   Numero de secuencia "nrosecuencia  entre Aceptante y   Girador "
             */

            nrosecuencia = new decimal(0);

            XmlNodeList ListaProtestosAceptantes = xmlDoc.SelectNodes("OUT/PROTESTOS/ACEPTANTE/ACE");
            foreach (XmlElement nodo in ListaProtestosAceptantes)
            {
                nrosecuencia = nrosecuencia + 1;

                Protesto oProtestoAceptante = new Protesto();
                oProtestoAceptante.NumeroSecuencia = nrosecuencia;
                oProtestoAceptante.TipoProtesto = TIPOPROTESTO.ACEPTANTE;
                oProtestoAceptante.CodCamaraComercioLima = GetValorNodo(nodo, "CO_DOCUME") == string.Empty ? 0 : Convert.ToDecimal(GetValorNodo(nodo, "CO_DOCUME"));
                oProtestoAceptante.FechaDocumento = Convert.ToDateTime(GetValorNodo(nodo, "FE_DOCUME"));
                oProtestoAceptante.TipoDocumento = GetValorNodo(nodo, "TI_DOCUME");
                oProtestoAceptante.TipoMoneda = GetValorNodo(nodo, "TI_MONEDA");
                oProtestoAceptante.FechaArreglo = Convert.ToDateTime(GetValorNodo(nodo, "FE_ARRGLO"));
                oProtestoAceptante.NomUbigeo = GetValorNodo(nodo, "NO_UBIGEO");
                oProtestoAceptante.NomEntidad = GetValorNodo(nodo, "NO_GIRADO");
                oProtestoAceptante.Importe = GetValorNodo(nodo, "IM_DOCUME") == string.Empty ? new decimal(0) : Convert.ToDecimal(GetValorNodo(nodo, "IM_DOCUME"));

                Protestos.Add(oProtestoAceptante);

            }


            XmlNodeList ListaProtestosGirador = xmlDoc.SelectNodes("OUT/PROTESTOS/GIRADOR/GIR");
            foreach (XmlElement nodo in ListaProtestosGirador)
            {
                nrosecuencia = nrosecuencia + 1;

                Protesto oProtestoGirador = new Protesto();
                oProtestoGirador.NumeroSecuencia = nrosecuencia;
                oProtestoGirador.TipoProtesto = TIPOPROTESTO.GIRADOR;
                oProtestoGirador.CodCamaraComercioLima = GetValorNodo(nodo, "CO_DOCUME") == string.Empty ? 0 : Convert.ToDecimal(GetValorNodo(nodo, "CO_DOCUME"));
                oProtestoGirador.FechaDocumento = Convert.ToDateTime(GetValorNodo(nodo, "FE_DOCUME"));
                oProtestoGirador.TipoDocumento = GetValorNodo(nodo, "TI_DOCUME");
                oProtestoGirador.TipoMoneda = GetValorNodo(nodo, "TI_MONEDA");
                oProtestoGirador.FechaArreglo = Convert.ToDateTime(GetValorNodo(nodo, "FE_ARRGLO"));
                oProtestoGirador.NomUbigeo = GetValorNodo(nodo, "NO_UBIGEO");
                oProtestoGirador.NomEntidad = GetValorNodo(nodo, "NO_ACEPTA");
                oProtestoGirador.Importe = GetValorNodo(nodo, "IM_DOCUME") == string.Empty ? new decimal(0) : Convert.ToDecimal(GetValorNodo(nodo, "IM_DOCUME"));

                Protestos.Add(oProtestoGirador);
            }
            //ir al as400 
            //ADVERSOS/ADV
            nrosecuencia = new decimal(0);
            XmlNodeList ListaAdeversos = xmlDoc.SelectNodes("OUT/ADVERSOS/ADV");
            foreach (XmlElement nodo in ListaAdeversos)
            {
                nrosecuencia = nrosecuencia + 1;
                Adversos oAdversos = new Adversos();
                oAdversos.NumeroSecuencia = nrosecuencia;
                oAdversos.NombreEntidad = GetValorNodo(nodo, "NO_ENTIDA");
                oAdversos.TipoDocumento = GetValorNodo(nodo, "TI_DOCUME");
                oAdversos.TipoRechazo = GetValorNodo(nodo, "TI_RECHAZ");
                oAdversos.TipoMoneda = GetValorNodo(nodo, "TI_MONEDA");
                oAdversos.TipoSancion = GetValorNodo(nodo, "TI_SANCIO");
                oAdversos.Importe = GetValorNodo(nodo, "IM_CHEQUE") == string.Empty ? new decimal(0) : Convert.ToDecimal(GetValorNodo(nodo, "IM_CHEQUE"));
                oAdversos.FechaCierre = Convert.ToDateTime(GetValorNodo(nodo, "FE_RECHAZ"));
                oAdversos.FechaReporte = Convert.ToDateTime(GetValorNodo(nodo, "FE_REPORT"));
                oAdversos.FechaSancion = Convert.ToDateTime(GetValorNodo(nodo, "FE_SANCIO"));

                AdversosList.Add(oAdversos);
            }
            nrosecuencia = new decimal(0);
            XmlNodeList ListaOmisos = xmlDoc.SelectNodes("OUT/OMISOS/OMI");
            foreach (XmlElement nodo in ListaOmisos)
            {
                nrosecuencia = nrosecuencia + 1;
                Omisos oOmisos = new Omisos();
                oOmisos.NumeroSecuencia = nrosecuencia;
                oOmisos.FechaReporte = Convert.ToDateTime(GetValorNodo(nodo, "FE_REPORT"));
                oOmisos.EntidadReportante = GetValorNodo(nodo, "NO_TRIBUT");
                oOmisos.Periodo = GetValorNodo(nodo, "FE_PERIOD");

                OmisosList.Add(oOmisos);
            }

            //ir al as400 
            XmlNodeList ListaDatosGenerales = xmlDoc.SelectNodes("OUT/DATGEN/DAT");
            foreach (XmlElement nodo in ListaDatosGenerales)
            {
                DatGen oDatGen = new DatGen();

                oDatGen.TipoPersona = GetValorNodo(nodo, "TI_PERSON");
                oDatGen.NroDocumento = GetValorNodo(nodo, "CO_DOCIDE");
                oDatGen.NroRuc = GetValorNodo(nodo, "CO_DOCTRI");
                oDatGen.NomCliente = GetValorNodo(nodo, "NO_CLIENT");
                oDatGen.NomComercial = GetValorNodo(nodo, "NO_COMERC");
                oDatGen.NomDepartamento = GetValorNodo(nodo, "NO_DEPART");
                oDatGen.NomProvincia = GetValorNodo(nodo, "NO_PROVIN");
                oDatGen.NomDistrito = GetValorNodo(nodo, "NO_DISTRI");
                oDatGen.NomDirreccion = GetValorNodo(nodo, "NO_DIRECC");
                oDatGen.TipoDomicilio = GetValorNodo(nodo, "NO_DOMICI");
                oDatGen.TipoContribuyente = GetValorNodo(nodo, "NO_CONTRI");
                oDatGen.Actividad = GetValorNodo(nodo, "NO_CIIU");
                oDatGen.FechaNacimiento = Convert.ToDateTime(GetValorNodo(nodo, "FE_NACIMI"));
                oDatGen.NumTelefono = GetValorNodo(nodo, "NU_TELEFO");
                oDatGen.NumTelFax = GetValorNodo(nodo, "NU_TELFAX");

                DatGenList.Add(oDatGen);
            }

            if (DatGenList.Count == 0)
            {
                DatGen oDatGen = new DatGen();
                oDatGen.NomCliente = "*** SIN INFORMACION SUNAT ***";
                DatGenList.Add(oDatGen);
            }

            if (DatGenList.Count > 1)
            {
                DatGen oDatGen = DatGenList.Find(delegate(DatGen _datgen) { return _datgen.NroDocumento == PsNroDoc; });
                if (oDatGen != null)
                {
                    DatGenList.Clear();
                    DatGenList.Add(oDatGen);
                }
            }


            nrosecuencia = new decimal(0);
            XmlNodeList ListaOtrasDir = xmlDoc.SelectNodes("OUT/OTRDIR/DIR");
            foreach (XmlElement nodo in ListaOtrasDir)
            {
                OtrDir oOtrDir = new OtrDir();
                nrosecuencia = nrosecuencia + 1;
                oOtrDir.NumeroSecuencia = nrosecuencia;
                oOtrDir.FechaReporte = Convert.ToDateTime(GetValorNodo(nodo, "FE_REPORT"));
                oOtrDir.NomDireccion = GetValorNodo(nodo, "NO_DIRECC");
                oOtrDir.NomEntidad = GetValorNodo(nodo, "NO_ENTIDA");

                OtrDirList.Add(oOtrDir);
            }


            nrosecuencia = new decimal(0);
            XmlNodeList ListaRepLegales = xmlDoc.SelectNodes("OUT/REPLEG/REP");
            foreach (XmlElement nodo in ListaRepLegales)
            {
                nrosecuencia = nrosecuencia + 1;

                RepresentantesLegales RepLegales = new RepresentantesLegales();

                RepLegales.NumeroSecuencia = nrosecuencia;
                RepLegales.CodDocumentoIdentidad = GetValorNodo(nodo, "CO_DOCIDE");
                RepLegales.CodRUC = GetValorNodo(nodo, "CO_DOCTRI");
                RepLegales.NomCargo = GetValorNodo(nodo, "NO_CARGO");
                RepLegales.NomCliente = GetValorNodo(nodo, "NO_CLIENT");
                RepLegales.TipoPersona = GetValorNodo(nodo, "TI_PERSON");

                RepLegalesList.Add(RepLegales);

            }
        }




        #endregion
        #region Metodos Privados
        private string GetValorNodo(XmlElement nodo, string tag)
        {
            return ((XmlNodeList)nodo.SelectNodes(tag))[0].InnerText;
        }

        private decimal _valor = 0;
        private string _fecha = string.Empty;

        private bool encuentraDeuda(Deudas d)
        {
            if (d.CodCuentaSBS == _valor && d.FechaReporte == _fecha)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        #endregion 
    }
}
